#include "app_message.h"
#include "app_common.h"
#include "cJSON.h"
#include <string.h>
#include "log.h"

/**
 * @brief  字节数组转换为json 
 * @param  *data: 字节数组
 * @param  len: 字节数组长度
 * @return json字符串
 * 
 * 1 从字节数组中提取  连接类型、id 、消息体
 * 2 id 和 消息体 需要把字节转换为两位16进制字符串
 * 3 创建json对象  把 连接类型 id、消息体 添加到json对象中 打印为json
 * 
 */

 char *app_message_bytes_to_json( char *data, int data_len)
 {
    //1 从字节数组中提取  连接类型、id 、消息体
    char conn_type=data[0];//连接类型
    int id_len=data[1];
    int msg_len=data[2];
    char id[id_len];//id
    char msg[msg_len]; //msg
    memcpy(id,data+3,id_len);
    memcpy(msg,data+3+id_len,msg_len);


     // 2 id 和 消息体 需要把字节转换为两位16进制字符串
     char *id_hexstr= app_common_bytes2hexstr(id,id_len);
     char *msg_hexstr= app_common_bytes2hexstr(msg,msg_len);

     // 3 创建json对象  把 连接类型 id、消息体 添加到json对象中 打印为json
     cJSON *root= cJSON_CreateObject();
     cJSON_AddNumberToObject(root,"conn_type",conn_type);
     cJSON_AddStringToObject(root,"id",id_hexstr);
     cJSON_AddStringToObject(root,"msg",msg_hexstr);
     char *json_str= cJSON_PrintUnformatted(root);
     cJSON_Delete(root);

     return json_str;

 }


 /**
  * @brief  json字符串转换为字节数组 
  * @param  jsonstr:  json字符串
  * @param  data_buff: 字节数组容器指针
  * @param  buff_len: 字节数组容器长度
  * @return 数据实际转换后的长度 
  * 1 把json数组转为cjson对象 ，提取相关值 conn_type id msg
  * 2 id msg 转为字节数组 
  * 3 把conn_type id_len msg_len id msg 拼接字节数组
  * 
  */
 int app_message_json_to_bytes(char *jsonstr, char *data_buff, int buff_len)
 {
    //1 把json数组转为cjson对象 ，提取相关值 conn_type id msg
    cJSON *root = cJSON_Parse(jsonstr);
    if(root == NULL)
    {
        log_error("cjson parse error");
        return -1;
    }
    cJSON *conn_type_cjson = cJSON_GetObjectItem(root, "conn_type");
    cJSON *id_cjson = cJSON_GetObjectItem(root, "id");
    cJSON *msg_cjson = cJSON_GetObjectItem(root, "msg");
    int  conn_type = conn_type_cjson->valueint;
    char *id_hexstr = id_cjson->valuestring;
    char *msg_hexstr = msg_cjson->valuestring;

    // 2 id msg 转为字节数组 
    int id_len=strlen(id_hexstr) / 2;
    char id[id_len];
    int msg_len=strlen(msg_hexstr) / 2;
    char msg[msg_len];
    id_len= app_common_hexstr2bytes(id_hexstr,id,id_len);
    msg_len= app_common_hexstr2bytes(msg_hexstr,msg,msg_len);

    // 3 把conn_type id_len msg_len id msg 拼接字节数组
    data_buff[0]=conn_type;
    data_buff[1]=id_len;
    data_buff[2]=msg_len;
    memcpy(data_buff+3,id,id_len);
    memcpy(data_buff+3+id_len,msg,msg_len);

    int data_len=3+id_len+msg_len;
    return data_len;


 }